//
//  ViewController.swift
//  Calculator
//
//  Created by lirenqiang on 2017/10/19.
//  Copyright © 2017年 lirenqiang. All rights reserved.
//

import UIKit

class ViewController: UIViewController
{
    //instance(实例) variable(变量) property(属性) local variable(局部变量)
    //以上几种都是一个对象(object),都是一个指针,因为对象只存在于堆中.所以不需要多余的*,&
    
    @IBOutlet weak var display: UILabel!
    
    //如果下面这个变量没有初始化,那么会报错,
    //在Swift中,所有声明的变量都需要进行初始化.不能使用没有初始化的值.
    //这个变量是用来判断用户是否正在输入数字
    // true: 正在输入数字,那么display会一直对字符串进行append.
    // false: 那么意味着用户按过enter(),那么用户再次点击数字后,意味着用户开始输入下一个数字了,需要将display的内容清空,然后重新叠加.
    var userIsInTheMiddleOfTypingANumber: Bool = false
    
    var operandStack = [Double]()
    @IBAction func appendDigit(_ sender: UIButton) {
        //let 声明一个常量,不会改变.
        //这里的常量之所以没有指定类型,是因为Swift有一个非常强大的特性,就是类型推导(type inference)
        let digit = sender.currentTitle!
        
        //print() 是一个全局的函数
        //print()函数的参数是一个字符串,在这个字符串中,可以将一个对象包在'\()'当中,会将这个对象转换成一个字符串.
        
        if userIsInTheMiddleOfTypingANumber {
            //display.text是一个optional值,一个optional的String值是不能够加一个unOptional的string.
            //所以需要先对display.text进行解包.
            display.text = display.text! + digit
        } else {
            display.text = digit
            userIsInTheMiddleOfTypingANumber = true
        }
    }
    
    //enter 的作用就是将操作数添加到操作数栈中,并且将状态值置为false.
    @IBAction func enter() {
        userIsInTheMiddleOfTypingANumber = false
        operandStack.append(displayValue)
        print("operandStack = \(operandStack)")
    }
    
    @IBAction func operate(_ sender: UIButton) {

        let operation = sender.currentTitle!
        
        if userIsInTheMiddleOfTypingANumber {
            enter()
        }
        
        switch sender.currentTitle! {
        case "×": performOperation { $0 * $1 }
        case "÷": performOperation { $1 / $0 }
        case "＋": performOperation { $1 + $0 }
        case "－": performOperation { $1 - $0 }
        case "√": performOperation {sqrt($0)}
            
        default: break
        }
    }
    
    func performOperation(_ operation: (Double, Double) -> Double) {
        if operandStack.count >= 2 {
            displayValue = operation(operandStack.removeLast(), operandStack.removeLast())
            enter()
        }
    }
    
    func performOperation(_ operation: (Double) -> Double) {
        if operandStack.count >= 1 {
            displayValue = operation(operandStack.removeLast())
            enter()
        }
    }
    
    var displayValue: Double {
        get {
            return NumberFormatter().number(from: display.text!)!.doubleValue
        }
        set {
            display.text = "\(newValue)"
            userIsInTheMiddleOfTypingANumber = false
        }
        
    }
}

/*
 Optional Label并不会响应消息.
 */




